import axios from 'axios'
import store from '@/store'
import JSONbig from 'json-bigint'
// import { Toast } from 'vant'
import router from '@/router'
const request = axios.create({
  baseURL: 'http://toutiao.itheima.net/',
  transformResponse: [function (data) {
    // data =>原始的后台返回的json字符串数据
    // 这里的方法会覆盖axios对于返回结果的处理，默认进行的是JSON。parse 需要进行的是JSONbig.parse
    // 后台返回的有可能不是json字符串，JSONbig解析就会报错
    try {
      return JSONbig.parse(data)
    } catch (error) {
      // 如果解析不了，说明不是json格式，原样输出
      return data
    }
  }]
})
// 添加请求拦截器
request.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  const token = store.state.user.tokenInfo.token
  console.log(token)
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  console.log(error)
  return Promise.reject(error)
})

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response
}, async function (error) {
  // 对响应错误做点什么
  // 对响应错误做点什么 (失败响应) 处理401错误
  // console.dir(error)
  if (error.response.status === 401) {
    console.log('token过期了, 一小时过去了, 需要通过refresh_token去刷新token')
    // 获取 refresh_token, 判断是否存在, 存在就去刷新token
    const refreshToken = store.state.user.tokenInfo.refresh_token
    console.log(refreshToken)
    if (refreshToken) {
      try {
        console.log('存在refreshToken, 需要进行刷新token操作')
        // (1) 发送请求, 进行刷新token操作, 获取新的token
        // 注意: 这边发请求, 不用request实例, 用它会自动在请求前帮你携带token(会覆盖你的refresh_token)
        // 这边, 直接用 axios 发送请求
        const res = await axios({
          method: 'put',
          url: 'http://toutiao.itheima.net/v1_0/authorizations',
          // 请求头中携带refresh_token信息
          headers: {
            Authorization: `Bearer ${refreshToken}`
          }
        })
        const newToken = res.data.data.token
        // (2) 将新token更新到vuex中
        store.commit('user/setTokenFn', {
          refresh_token: refreshToken,
          token: newToken
        })
        console.log('>>>>>>>>>>>>>>>>>>>.', error.config)
        // 刷新token后，应该重新发送刚才的请求，让用户刷新token无感知
        return request(error.config)
      } catch (error) {
        console.log('使用refresh_token获取新token失败')
        // 清除本地token跳转路由
        store.commit('user/removeTokenInfo')
        // 路由跳转, 进入登录页
        router.push({
          path: '/login',
          query: {
            backto: router.currentRoute.fullPath
          }
        })
      }
    } else {
      console.log('没有refreshToken, 直接去登录, 将来还能跳回来')
      // 没有refreshToken, 直接去登录, 将来还能跳回来
      // router.currentRoute 指向当前路由信息对象 === 等价于之前页面中用的 this.$route
      // 清除本地token, 跳转登录 (无意义的本地token内容, 要清除)
      store.commit('user/removeTokenInfo')
      router.push({
        path: '/login',
        query: {
          backto: router.currentRoute.fullPath
        }
      })
    }
  }
  return Promise.reject(error)
})
export default request
